#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int MAXN = 1505;

int n, m;
char maze[MAXN][MAXN];
bool vis[MAXN][MAXN]; // 是否访问过相对位置
int vis_x[MAXN][MAXN], vis_y[MAXN][MAXN]; // 记录第一次访问时的实际坐标
int sx, sy;

// 方向数组：上下左右
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

bool success; // 是否找到无限路径

void dfs(int x, int y, int actual_x, int actual_y) {
    if (success) return;
    
    // 计算相对坐标
    int rx = (x % n + n) % n;
    int ry = (y % m + m) % m;
    
    // 如果是墙，返回
    if (maze[rx][ry] == '#') return;
    
    // 如果这个相对位置已经被访问过
    if (vis[rx][ry]) {
        // 检查实际坐标是否不同
        if (vis_x[rx][ry] != actual_x || vis_y[rx][ry] != actual_y) {
            success = true;
        }
        return;
    }
    
    // 标记访问
    vis[rx][ry] = true;
    vis_x[rx][ry] = actual_x;
    vis_y[rx][ry] = actual_y;
    
    // 向四个方向搜索
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        int n_actual_x = actual_x + dx[i];
        int n_actual_y = actual_y + dy[i];
        if (success) return;
        cout << nx << ny << n_actual_x << n_actual_y << endl;
        dfs(nx, ny, n_actual_x, n_actual_y);
        
    }
}

int main() {
    while (cin >> n >> m) {
        // 读取迷宫
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> maze[i][j];
                if (maze[i][j] == 'S') {
                    sx = i;
                    sy = j;
                }
            }
        }
        
        // 初始化访问数组
        memset(vis, 0, sizeof(vis));
        success = false;
        
        // 从起点开始DFS搜索
        dfs(sx, sy, sx, sy);
        
        if (success) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
    
    return 0;
}

